package es.udc.fbellas.j2ee.tiendaweb.model.direccionpostal.DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import es.udc.fbellas.j2ee.tiendaweb.model.direccionpostal.TO.DireccionPostalTO;
import es.udc.fbellas.j2ee.util.exceptions.InternalErrorException;
import es.udc.fbellas.j2ee.util.sql.GeneralOperations;

/**
 * An implementation of <code>SQLAccountDAO</code> for databases providing
 * counter columns with JDBC 3 drivers.
 */
public class SQLDireccionPostalDAO {

/* comprobar si existe una tarjeta bancaria buscando por el número de tarjeta */

    public boolean exists(Connection connection, int idDir) 
        throws InternalErrorException {
        
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

        try {

            /* Create "preparedStatement". */
            String queryString = "SELECT IDDIR FROM DIRECCIONPOSTAL WHERE IDDIR = ?";
            preparedStatement = connection.prepareStatement(queryString);
            
            /* Fill "preparedStatement". */
            int i = 1;
            preparedStatement.setInt(i++, idDir);
            
            /* Execute query. */
            resultSet = preparedStatement.executeQuery();

            return resultSet.next();
            
        } catch (SQLException e) {
            throw new InternalErrorException(e);    
        } finally {
            GeneralOperations.closeResultSet(resultSet);
            GeneralOperations.closeStatement(preparedStatement);
        }
        
    }


/* crear nueva direccion postal */

    public DireccionPostalTO create(Connection connection, DireccionPostalTO direccionPostalTO) 
        throws InternalErrorException {
        
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
    
        try {
                
            /* Create "preparedStatement". */
            String queryString = "INSERT INTO DIRECCIONPOSTAL" +
                " ( NOMBRERECEPTOR, CALLE, PORTAL, PUERTA, CP) VALUES ( ?, ?, ?, ?, ?)";
            preparedStatement = connection.prepareStatement(queryString,
                Statement.RETURN_GENERATED_KEYS);    
            
            /* Fill "preparedStatement". */
            int i = 1;
            preparedStatement.setString(i++, direccionPostalTO.getNombreReceptor());
			preparedStatement.setString(i++, direccionPostalTO.getCalle());
			preparedStatement.setInt(i++, direccionPostalTO.getPortal());
			preparedStatement.setString(i++, direccionPostalTO.getPuerta());
			preparedStatement.setInt(i++, direccionPostalTO.getCP());
                        
            /* Execute query. */
            int insertedRows = preparedStatement.executeUpdate();
        
            if (insertedRows == 0) {
                throw new SQLException("No se puede añadir a la tabla" +
                    " 'DIRECCIONPOSTAL'");
            }

            if (insertedRows > 1) {
                throw new SQLException("Fila Duplicada en la tabla 'DIRECCIONPOSTAL'");
            }
            
            /* Get account identifier. */
            resultSet = preparedStatement.getGeneratedKeys();

            if (!resultSet.next()) {
                throw new InternalErrorException(new SQLException(
                    "JDBC driver did not return generated key."));
            }
            int idDir = resultSet.getInt(1); 
            
            /* Return the value object. */
            return new DireccionPostalTO(idDir, direccionPostalTO.getNombreReceptor(), direccionPostalTO.getCalle(), direccionPostalTO.getPortal(), direccionPostalTO.getPuerta(), direccionPostalTO.getCP());
        
        } catch (SQLException e) {
            throw new InternalErrorException(e);
        } finally {
            GeneralOperations.closeStatement(preparedStatement);
        }
        
    }


/* encontrar direccion postal a partir de su id */

    public DireccionPostalTO find(Connection connection, int idDir) 
        throws InternalErrorException {
        
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
    
        try {
                
            /* Create "preparedStatement". */
            String queryString = "SELECT IDDIR, NOMBRERECEPTOR, CALLE, PORTAL, PUERTA, CP FROM DIRECCIONPOSTAL" + " WHERE IDDIR = ?";
            preparedStatement = connection.prepareStatement(queryString);    
            
            /* Fill "preparedStatement". */
            int i = 1;
            preparedStatement.setInt(i++, 
                idDir);
                                    
            /* Execute query. */
			resultSet = preparedStatement.executeQuery();

            if (!resultSet.next()) {
                throw new InternalErrorException(new SQLException(
                    "No hay ninguna tarjeta bancaria con ese numero."));
            }

			/* get result */
			i = 1;
			int id = resultSet.getInt(i++);
			String nRecept = resultSet.getString(i++);
			String calle = resultSet.getString(i++);
			int portal = resultSet.getInt(i++);
			String puerta = resultSet.getString(i++);
			int cp = resultSet.getInt(i++);


			return new DireccionPostalTO(id, nRecept, calle, portal, puerta, cp);
        
        } catch (SQLException e) {
            throw new InternalErrorException(e);
        } finally {
            GeneralOperations.closeStatement(preparedStatement);
			GeneralOperations.closeResultSet(resultSet);
        }
        
    }

    public void update(Connection connection, DireccionPostalTO direccionPostalTO) 
        throws InternalErrorException {
        
        PreparedStatement preparedStatement = null;

        try {

            /* Create "preparedStatement". */
            String queryString = "UPDATE DIRECCIONPOSTAL" +
                " SET NOMBRERECEPTOR = ?, CALLE = ?, PORTAL = ?, PUERTA = ?, CP = ? WHERE IDDIR = ?";
            preparedStatement = connection.prepareStatement(queryString);
            
            /* Fill "preparedStatement". */
            int i = 1;
            preparedStatement.setString(i++, direccionPostalTO.getNombreReceptor());
			preparedStatement.setString(i++, direccionPostalTO.getCalle());
			preparedStatement.setInt(i++, direccionPostalTO.getPortal());
			preparedStatement.setString(i++, direccionPostalTO.getPuerta());
			preparedStatement.setInt(i++, direccionPostalTO.getCP());
			preparedStatement.setInt(i++, direccionPostalTO.getIdDir());


            /* Execute query. */
            int updatedRows = preparedStatement.executeUpdate();

            if (updatedRows > 1) {
                throw new SQLException("Fila duplicada para el identificador = '" + 
                    direccionPostalTO.getIdDir() + "' en tabla 'DIRECCIONPOSTAL'");
            }        
            
        } catch (SQLException e) {
            throw new InternalErrorException(e);    
        } finally {
            GeneralOperations.closeStatement(preparedStatement);
        }    
        
    }
    
    /* This class can by tested by "SQLAccountDAOFactory". */

}
